home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Magnum One
/
Magnum One (Mid-American Digital) (Disc Manufacturing).iso
/
d12
/
v10n07.arc
/
PALETTE.ARC
/
PIPES.ARC
/
PIPES.C
< prev
next >
Wrap
C/C++ Source or Header
|
1991-03-27
|
8KB
|
244 lines
/*----------------------------------------------------------------
PIPES.C -- Palette Animation Using Windows 3.0 Palette Manager
(c) Charles Petzold, 1990
----------------------------------------------------------------*/
#include <windows.h>
long FAR PASCAL WndProc (HWND, WORD, WORD, LONG) ;
#define ID_TIMER 1
int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance,
LPSTR lpszCmdLine, int nCmdShow)
{
char szAppName [] = "Pipes" ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
if (!hPrevInstance)
{
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = NULL ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = szAppName ;
wndclass.lpszClassName = szAppName ;
RegisterClass (&wndclass) ;
}
hwnd = CreateWindow (szAppName, "Pipes: Palette Animation",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ;
ShowWindow (hwnd, nCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}
long FAR PASCAL WndProc (HWND hwnd, WORD message, WORD wParam, LONG lParam)
{
static BOOL bLeftToRight = TRUE ;
static HPALETTE hPal ;
static LOCALHANDLE hLocalMem ;
static LOGPALETTE *plp ;
static short cxClient, cyClient, iIndex = 0 ;
BOOL bPalSupport ;
HBRUSH hBrush ;
HDC hdc ;
int x1, x2, y1, y2 ;
long i ;
PAINTSTRUCT ps ;
RECT rc ;
switch (message)
{
case WM_CREATE:
// Check for palette support
hdc = GetDC (hwnd) ;
bPalSupport = (RC_PALETTE & GetDeviceCaps (hdc, RASTERCAPS)) &&
(GetDeviceCaps (hdc, SIZEPALETTE) -
GetDeviceCaps (hdc, NUMRESERVED) > 16) ;
ReleaseDC (hwnd, hdc) ;
if (!bPalSupport)
{
MessageBox (hwnd, "Program requires palette support",
"Bounce", MB_ICONEXCLAMATION | MB_OK) ;
DestroyWindow (hwnd) ;
return 0 ;
}
// Allocate memory for LOGPALETTE structure and lock it
hLocalMem = LocalAlloc (LMEM_MOVEABLE, sizeof (LOGPALETTE) +
32 * sizeof (PALETTEENTRY)) ;
plp = (LOGPALETTE *) LocalLock (hLocalMem) ;
// Initialize the fields of the LOGPALETTE structure
plp->palVersion = 0x300 ;
plp->palNumEntries = 16 ;
for (i = 0 ; i <= 8 ; i++)
{
plp->palPalEntry[i].peRed = min (255, 0x20 * i) ;
plp->palPalEntry[i].peGreen = 0 ;
plp->palPalEntry[i].peBlue = min (255, 0x20 * i) ;
plp->palPalEntry[i].peFlags = PC_RESERVED ;
plp->palPalEntry[16 - i] = plp->palPalEntry[i] ;
plp->palPalEntry[16 + i] = plp->palPalEntry[i] ;
plp->palPalEntry[32 - i] = plp->palPalEntry[i] ;
}
// Create the logical palette & unlock the memory block
hPal = CreatePalette (plp) ;
LocalUnlock (hLocalMem) ;
// Set the timer for 100 msec
SetTimer (hwnd, ID_TIMER, 100, NULL) ;
return 0 ;
case WM_SIZE:
cxClient = LOWORD (lParam) ;
cyClient = HIWORD (lParam) ;
return 0 ;
case WM_TIMER:
plp = (LOGPALETTE *) LocalLock (hLocalMem) ;
// Animate the palette
AnimatePalette (hPal, 0, 16, plp->palPalEntry + iIndex) ;
// Increment the index
iIndex = (iIndex + 1) % 16 ;
LocalUnlock (hLocalMem) ;
return 0 ;
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
SelectPalette (hdc, hPal, FALSE) ;
RealizePalette (hdc) ;
// Draw window background
GetWindowRect (hwnd, &rc) ;
hBrush = SelectObject (hdc, GetStockObject (WHITE_BRUSH)) ;
FillRect (hdc, &rc, hBrush) ;
// Draw the interiors of the pipes
for (i = 0 ; i < 128 ; i++)
{
hBrush = CreateSolidBrush (PALETTEINDEX (i % 16)) ;
SelectObject (hdc, hBrush) ;
rc.left = (127 - i) * cxClient / 128 ;
rc.right = (128 - i) * cxClient / 128 ;
rc.top = 4 * cyClient / 14 ;
rc.bottom = 5 * cyClient / 14 ;
FillRect (hdc, &rc, hBrush) ;
rc.left = i * cxClient / 128 ;
rc.right = (i + 1) * cxClient / 128 ;
rc.top = 9 * cyClient / 14 ;
rc.bottom = 10 * cyClient / 14 ;
FillRect (hdc, &rc, hBrush) ;
DeleteObject (SelectObject (hdc,
GetStockObject (BLACK_BRUSH))) ;
}
// Draw the edges of the pipes
MoveTo (hdc, 0, 4 * cyClient / 14) ;
LineTo (hdc, cxClient, 4 * cyClient / 14) ;
MoveTo (hdc, 0, 5 * cyClient / 14) ;
LineTo (hdc, cxClient, 5 * cyClient / 14) ;
MoveTo (hdc, 0, 9 * cyClient / 14) ;
LineTo (hdc, cxClient, 9 * cyClient / 14) ;
MoveTo (hdc, 0, 10 * cyClient / 14) ;
LineTo (hdc, cxClient, 10 * cyClient / 14) ;
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_QUERYNEWPALETTE:
hdc = GetDC (hwnd) ;
SelectPalette (hdc, hPal, FALSE) ;
if (RealizePalette (hdc) > 0)
{
ReleaseDC (hwnd, hdc) ;
InvalidateRect (hwnd, NULL, FALSE) ;
return TRUE ;
}
else
{
ReleaseDC (hwnd, hdc) ;
return FALSE ;
}
break ;
case WM_PALETTECHANGED:
if (wParam != hwnd)
{
hdc = GetDC (hwnd) ;
SelectPalette (hdc, hPal, FALSE) ;
if (RealizePalette (hdc) > 0)
{
InvalidateRect (hwnd, NULL, FALSE) ;
}
ReleaseDC (hwnd, hdc) ;
}
return 0 ;
case WM_DESTROY :
KillTimer (hwnd, ID_TIMER) ;
LocalFree (hLocalMem) ;
DeleteObject (hPal) ;
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}